package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ISocCheckDAO;
import org.jsola.hr.dto.SocCheckAddDTO;
import org.jsola.hr.dto.SocCheckItemImportDTO;
import org.jsola.hr.dto.SocCheckUpdateDTO;
import org.jsola.hr.entity.SocCheckDO;
import org.jsola.hr.query.SocCheckCustomQuery;
import org.jsola.hr.query.SocCheckQuery;
import org.jsola.hr.vo.SocCheckListVO;
import org.jsola.hr.vo.SocCheckParseImportListVO;
import org.jsola.hr.vo.SocCheckVO;
import org.jsola.user.core.TokenUser;

import java.io.File;
import java.math.BigDecimal;
import java.util.List;


/**
 * 社保校验表
 *
 * @author zhr
 */
public interface ISocCheckService extends IService<ISocCheckDAO, SocCheckDO> {

    /**
     * 新增社保校验表
     *
     * @param socCheckAddDTO 新增社保校验表DTO
     * @param tokenUser      当前用户
     * @return 社保校验表详情信息
     */
    SocCheckVO save(SocCheckAddDTO socCheckAddDTO, TokenUser tokenUser);

    /**
     * 修改社保校验表
     *
     * @param socCheckUpdateDTO 修改社保校验表DTO
     * @param tokenUser         当前用户
     * @return 更新数量
     */
    int update(SocCheckUpdateDTO socCheckUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除社保校验表，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser   当前用户
     * @param socCheckIds 社保校验表id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... socCheckIds);

    /**
     * 根据社保校验表id查找
     *
     * @param socCheckId 社保校验表id
     * @param siteId     所属站点id
     * @return 社保校验表详情信息
     */
    SocCheckVO selectById(String socCheckId, String siteId);

    /**
     * 查询社保校验表
     *
     * @param socCheckQuery 查询条件
     * @param siteId        所属站点id
     * @return 社保校验表列表信息
     */
    List<SocCheckListVO> select(SocCheckQuery socCheckQuery, String siteId);

    /**
     * 查询社保校验表记录数
     *
     * @param socCheckQuery 查询条件
     * @param siteId        所属站点id
     * @return 社保校验表记录数
     */
    int selectCount(SocCheckQuery socCheckQuery, String siteId);

    /**
     * 分页查询社保校验表
     *
     * @param socCheckQuery 查询条件
     * @param siteId        所属站点id
     * @return 社保校验表列表信息
     */
    Page<SocCheckListVO> selectPage(SocCheckQuery socCheckQuery, String siteId);


    /**
     * 根据社保校验表id查找
     *
     * @param socCheckId 社保校验表id
     * @param siteId     所属站点id
     * @return 社保校验表
     */
    SocCheckDO selectDOById(String socCheckId, String siteId);

    /**
     * 查询社保校验表
     *
     * @param socCheckQuery 查询条件
     * @param siteId        所属站点id
     * @return 社保校验表列表
     */
    List<SocCheckDO> selectDO(SocCheckQuery socCheckQuery, String siteId);


    /**
     * 根据monthId列表删除校验数据
     *
     * @param socMonthIdList MonthId列表
     * @param tokenUser      当前用户
     */
    void deleteByMonthIdList(List<String> socMonthIdList, TokenUser tokenUser);

    /**
     * 根据monthId查询此月检验列表
     *
     * @param socMonthId monthId
     * @param tokenUser  当前用户
     * @return 检验列表
     */
    List<SocCheckDO> selectByMonthId(String socMonthId, TokenUser tokenUser);

    /**
     * 根据校验类型和参保月Id分页查询检验数据
     *
     * @param socCheckCustomQuery 查询参数
     * @param tokenUser           当前用户
     * @return 校验数据
     */
    Page<SocCheckVO> pageByMonthIdAndCheckType(SocCheckCustomQuery socCheckCustomQuery, TokenUser tokenUser);

    /**
     * 查询月份社保校验的条目
     *
     * @param checkType  校验类型
     * @param socMonthId 参保月份Id
     * @param tokenUser  当前用户
     * @return 条目
     */
    Integer selectCountByMonthId(Integer checkType, String socMonthId, TokenUser tokenUser);

    /**
     * 解析导入文件
     *
     * @param file      文件
     * @param tokenUser 当前用户
     * @return 解析结果
     */
    List<SocCheckParseImportListVO> parseSocCheckImportFile(File file, TokenUser tokenUser);

    /**
     * 社保校验Excel监听
     *
     * @param file           文件
     * @param socCheckAddDTO 保存参数
     * @param tokenUser      当前用户
     * @return 解析结果
     */
    List<SocCheckParseImportListVO> saveSocCheckImportFile(File file, SocCheckAddDTO socCheckAddDTO, TokenUser tokenUser);

    /**
     * 社保校验,官方网站校验
     *
     * @param socCheckCustomQuery 校验参数
     * @param tokenUser           当前用户
     */
    void checkWebSiteDate(SocCheckCustomQuery socCheckCustomQuery, TokenUser tokenUser);

    /**
     * 社保校验Excel入库
     *
     * @param socCheckItemImportList 入库数据
     * @param socCheckAddDTO         入库参数
     * @param tokenUser              当前用户
     */
    void saveExcelDate(List<SocCheckItemImportDTO> socCheckItemImportList, SocCheckAddDTO socCheckAddDTO, TokenUser tokenUser);

    /**
     * 校验一个BigDecimal是否为空
     *
     * @param checkSource 校验主体
     * @return 如果是空返回一个为0的BigDecimal
     */
    BigDecimal checkNull(BigDecimal checkSource);

}


